概要
この記事の前半では、UEのメモリ最適化に役立つ便利なコマンドとツールを紹介します。後半では、それらのコマンドとツールを活用してUEのメモリ最適化を行う方法を解説します。 参考記事や動画が多数ありますので、そちらも併せてご覧いただくと、より理解が深まるかと思います。
環境
- Unreal Engine 5.4
本編
メモリ最適化の目的
- パフォーマンス向上
- 効率的なメモリ管理により、ゲームのフレームレートや全体のパフォーマンスが向上する
- メモリ不足クラッシュを解消
- ロード時間短縮
- 最適化されたテクスチャやアセットにより、ロード時間が短縮される
UE 便利なメモリ管理コマンドとツール
stat memory
- コマンド
stat memory
現在のメモリ使用量ジャンルごとにゲーム画面に表示
Memreport
- コマンド
memreport -full
メモリリポート、ダンプファイルに保存 - コマンド
memreport -log
メモリリポート、log に表示
Memreport 参考:
Qiita: Memreport でメモリリークの原因を調査 Ari's Unreal Engine Notes: Debugging Memory Leaks [UE4]Memreport を活用しよう!
- Memreportの一部:全体メモリー使用量を表示される
- ダンプファイルに"Physical Memory"を検索すると出てきます。
- Memreportの一部:テクスチャをメモリー使用量降順で表示される
- ダンプファイルに"listtextures"を検索すると出てきます。
Object List
- コマンド
obj list
現在存在しているオブジェクトを表示 - コマンド
obj list name=
現在存在しているオブジェクト名前で検索 - コマンド
obj refs name=
現在存在しているオブジェクト名前で検索、参照されている先を表示
obj list 参考記事:
obj list参考画像
GC(ガベージコレクション)を実行するコマンド
- コマンド
obj gc
- ガベージ コレクションを一回実行する
- コマンド
gc.ForceCollectGarbageEveryFrame 1
- 毎フレーム強制的に GC を実行するコマンド
- コマンド
gc.ForceCollectGarbageEveryFrame 0
- 毎フレーム強制的に GC 実行を停止するコマンド
GC されることで、アセットが解放されるかどうか、または参照が残っているかどうかを確認できる。
毎フレーム強制的に GC を実行するコマンドはゲームの動作が重くなるため、調査目的以外での使用は控えた方がよいです。
GC 参考:
GC とは: 公式ドキュメント:Unreal でのオブジェクト処理
【UE4】UObject の PendingKill について | 株式会社ヘキサドライブ | HEXADRIVE | ゲーム制作を中心としたコンテンツクリエイト会社
ツール: Low Level Memory Tracker(LLM)
- コマンド
stat llm
Low Level Memory Tracker(LLM)はメモリの使用状況を追跡するツールです。 詳しくは参考をご覧ください。
LLM参考:
ツール: 参照ヴューア(Reference Viewer)
アセットの参照元または参照先になっているアセットのグラフに表示されるツールです。 UE 内アセットを右クリック->参照ヴューア で使うことができます。 読み込またくないアセットが読み込まれた時に調査に役を立ちます。
ツール: Size Map
UE 内アクターを右クリック-> Size Map, 右上 Memory を選択するとそのアセットが参照ている全部のアセットメモリ容量を見えることができる
Size Map 参考:
動画: How To Optimise Memory Usage In Your Unreal Engine 5 Game
ツール:Memory Insight
どの時点でメモリの割り当てと解放情報を確認できるツールです。 例:Time A -> Time B メモリ増加量 123.456MB
Memory Insight 参考:
Qiita: UE4 Memory Insights を使用したメモリトラッキング
Memory Insight 使うメモリリークを調査実例動画34:38: Maximizing Your Game's Performance in Unreal Engine | Unreal Fest 2022
メモリ調査方法と最適化アプローチ
メモリ最適化フローを紹介していきます。基本的には下図の流れになります。
メモリ不足問題を特定
メモリ不足問題は、クラッシュログやメモリ不足通知を確認して特定できます。
- ただしメモリ低下の警告ログが出る場合もあれば、出ないこともあります。
データ収集
stat memory
、memreport
、memory insight、UE 以外のプロファイラーなどを使って
メモリ使用状況を調べる
- 必ず実機やパッケージ版で調べる
- PIE モードでは事前に読み込まれたキャッシュや背景での動作が影響し、正確な測定が難しくなる
- 機種によるメモリ使用量が異なる
全体メモリ使用量を確認
全体メモリ使用量の確認をする、物理メモリ空き 500MB 以上確保すると安全。
memreport -full
利用して確認。
- Memreportの一部:全体メモリー使用量を表示される
- ダンプファイルに"Physical Memory"を検索すると出てきます。
テクスチャメモリ使用量を確認
リポートの listtextures nonvt を表示するところで確認可能(サイズが大きい順に表示)
memreport -full
利用して確認。
- Memreportの一部:テクスチャをメモリー使用量降順で表示される
- ダンプファイルに"listtextures"を検索すると出てきます。
データの分析
メモリレポートで使用量が突出しているリソース(テクスチャ、マテリアルなど)を特定 不要なアセットやサイズが過大なアセットを洗い出す
不要なアセットを読み込まれた調査
コマンド obj list name=
を使用し、該当アセット名で検索し、読み込まれたかどうかを確認可能。
使用例:obj list name=T_SomeTexture
コマンド obj refs name=
を使用し、
該当するアセットがどの元に参照されているかを表示し、読み込まれた原因を特定できる
使用例:obj refs name=T_SomeTexture
また、参照ヴューア(Reference Viewer)と合わせて参照元、読み込まれた原因を更に追跡し、どうやってハード参照(ハードリファレンス)されているのを調査します。
ハード参照とソフト参照については:
改善策の提案
- 不要なアセットの削除や、読み込まない対応
- 大きいテクスチャ解像度の削減や圧縮設定の調整
- その他(データ分析により提案が異なる)
- 例: モバイルゲームではライティングの設定を調整することでメモリ使用量を軽減することでができます。
圧縮フォーマット参考:
テクスチャのフォーマットについて [UE5] 画像の圧縮フォーマット
テクスチャ最適化:
改善策の実施
問題アセットを修正や読み込まない対応を行う。
- 不要なアセットの削除
- ハードリファレンスを削除
- 使用済み解放すべきアセットを解放する
- ハードリファレンスをソフトリファレンスに変更し、解放すべきタイミングで nullptr に設定することで、次回の GC 実行時に解放されるようになります。
- 大きいテクスチャ解像度の削減や圧縮設定の調整
- その他
効果検証
修正後に再度メモリレポートを取得し、改善状況を確認する
問題アセットが読み込まなくなるかどうか
GC を実行するコマンド gc.ForceCollectGarbageEveryFrame 1
やobj gc
を利用する。
アセットが参照されなくなる(ソフト参照では Nullptr をセット)時点 GC を強制実行すれば解放される、またobj list name=
を利用して、該当アセットが存在しているかどうかで解放されたどうかを確認できます、また存在している(読み込まれている)場合はまだ参照が残っていることです、データ分析の方もう一度行ってください。
メモリ使用量の変化を比較
コマンドmemreport -full
かmemreport -log
で全体メモリ使用量を確認し、対応前後を比較します。
メモリ最適化の所感
- メモリリークを防ぐために意識する習慣
- 解放すべきアセットが nullptr になっているかどうかをチェック
- ハード参照によってすべてのオブジェクトが読み込まれることに注意
- ソフト参照の使用を検討する
- アセットの管理を適切に行う
- 圧縮可能かどうか、またはテクスチャが過度に大きくないかを確認する
- 継続的なメモリ監視が必要
まとめ
- メモリ最適化の重要性
- パフォーマンス向上、ロード時間短縮、メモリ不足クラッシュの解消が目標。
- UE 便利なメモリ管理コマンドとツール
stat memory
memreport -log
,memreport -full
obj list
,obj list name=
,obj refs name=
obj gc
,gc.ForceCollectGarbageEveryFrame 1
- LLM
- Reference Viewer
- SizeMap
- Memory Insight
- メモリ調査方法 問題の特定、データ収集、データ分析、改善策検討と実施、効果検証
- 改善策の例
- 不要なアセットの削除や、読み込まない対応
- 大きいテクスチャ解像度の削減や圧縮設定の調整
- その他(データ分析により異なる)
最後に
メモリー不足でクラッシュする際にこの記事を役に立たれば嬉しいです。 もし誤りがあればがコメントで教えていただければ修正いたします。
参考資料
- Qiita: Memreport でメモリリークの原因を調査
- Ari's Unreal Engine Notes: Debugging Memory Leaks
- [UE4]Memreport を活用しよう!
- [UE4] Obj コマンドによるオブジェクト解析
- 公式ドキュメント:Unreal でのオブジェクト処理
- 【UE5】強制的にガベージコレクションを動作させる
- 【UE4】UObject の PendingKill について | 株式会社ヘキサドライブ | HEXADRIVE | ゲーム制作を中心としたコンテンツクリエイト会社
- 公式ドキュメント:Low-Level Memory Tracker
- [UE4] LLM (Low Level Memory Tracker)を使用したメモリトラッキング
- 公式ドキュメント:参照ヴューア
- 動画: How To Optimise Memory Usage In Your Unreal Engine 5 Game
- Qiita: UE4 Memory Insights を使用したメモリトラッキング
- 公式ドキュメント: Memory Insights
- 動画: Maximizing Your Game's Performance in Unreal Engine | Unreal Fest 2022
- ハード参照とソフト参照
- BP の参照連鎖を断つ手法
- テクスチャのフォーマットについて
- [UE5] 画像の圧縮フォーマット
- 動画: Optimizing textures for Mobile in Unreal Engine 5
- デバッグとメモリーの最適化
- UE5 のミップマップの基本的な設定について